前端开发人员,有时候需要做一些接口调试,koa2+mysql2的组合方式恰好能够快速实现,作为学习笔记记录下

##环境准备

首先需要node.js和mysql,mac可使用homebrew快速安装

##搭建koa2项目

可以命令一步一步搭建

1
npm init

这里我们使用koa-generator生成项目,类似vue-cli

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
### 全局安装 koa-generator
npm install koa-generator -g

### 创建项目,demo为项目名
koa2 demo

### 进入项目目录
cd demo

### 安装项目依赖
npm install

### 启动项目 可任选一种
npm start (每次代码修改都需要重启项目)
npm run dev (代码发生改变时自动重启项目)

生成的项目目录结构如下,可以看到package.json中已给我们添加了很多插件依赖

启动项目完成后,在浏览器输入:localhost:3000,浏览器运行结果,搭建的koa2项目就已完成

##实现API

####安装依赖

这里选择Node的ORM框架Sequelize来操作数据库。这样,我们读写的都是JavaScript对象,Sequelize帮我们把对象变成数据库中的行,同时安装mysql2。

1
npm install sequelize mysql2 --save

####数据库连接

在根目录下新建config目录->新建db.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
const Sequelize = require('sequelize');
/**
* 数据库名称, 账号,密码
*/
const sequelize = new Sequelize('zf','root','123456',{
host:'localhost',
dialect:'mysql',
operatorsAliases:false,
dialectOptions:{
//字符集
charset:'utf8mb4',
collate:'utf8mb4_unicode_ci',
supportBigNumbers: true,
bigNumberStrings: true
},
pool:{
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
timezone: '+08:00' //东八时区
});

module.exports = {
sequelize
};

####定义数据模型

在根目录下新建models目录->新建pet.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
const moment = require('moment');
module.exports = function(sequelize,DataTypes){
return sequelize.define('pet',
{
id:{
type: DataTypes.INTEGER(11),
primaryKey: true,
allowNull: false,
autoIncrement: true
},
name:{
type: DataTypes.STRING(100),
allowNull: false,
field: 'name'
},
gender:{
type: DataTypes.TINYINT(0),
allowNull: false,
field: 'gender'
},
birth:{
type: DataTypes.DATE,
allowNull: false,
field: 'birth',
set: function(val) {
this.setDataValue('birth', new Date(val*1000));
},
get() {
return moment(this.getDataValue('birth')).format('YYYY-MM-DD HH:mm:ss');
}
},
isDeleted: {
type: DataTypes.BOOLEAN,
allowNull: true,
defaultValue: false
},
createdAt: {
type: DataTypes.DATE,
allowNull: true,
get() {
return moment(this.getDataValue('createdAt')).format('YYYY-MM-DD HH:mm:ss');
}
},
updatedAt: {
type: DataTypes.DATE,
allowNull: true,
get() {
return moment(this.getDataValue('updatedAt')).format('YYYY-MM-DD HH:mm:ss');
}
},
version: {
type: DataTypes.BIGINT,
allowNull: true,
}
},
{
/**
* 如果为true,则表示名称和model相同,即user
* 如果为fasle,mysql创建的表名称会是复数,即users
* 如果指定的表名称本身就是复数,则形式不变
*/
freezeTableName: true,

//关闭Sequelize的自动添加timestamp的功能
timestamps: false
}
);
}

####模型操作

在根目录下新建modules目录->新建pet.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
//引入db配置
const db = require('../config/db')

//引入sequelize对象
const Sequelize = db.sequelize

//引入数据表模型
const pet = Sequelize.import('../models/pet')
//自动创建表
pet.sync({ force: false });

//数据库操作类
class petModel {

static async createPet(data) {
var now = Date.now();
return await pet.create({
name: data.name,
gender: data.gender,
birth: data.birth,
createdAt: now,
updatedAt: now,
version: 0
})
}

static async getPets() {
return await pet.findAll({
where: {
}
})
}

static async getPet(id) {
console.log(id)
return await pet.findOne({
where: {
id
}
})
}
}

module.exports = petModel;

####逻辑操作

在根目录下新建controllers目录->新建pet.js文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
const petModel = require("../modules/pet");

class petController {
/**
* 创建宠物信息
* @param ctx
* @returns {Promise.<void>}
*/
static async create(ctx){
//接收客服端
let req = ctx.request.body;
if(req.name && req.gender && req.birth ){
try{
//创建宠物信息模型
const ret = await petModel.createPet(req);
const data = await petModel.getPet(ret.id);

ctx.response.status = 200;
ctx.body = {
code: 200,
msg: '创建宠物信息成功',
data
}
}catch(err){
console.log(err)
ctx.response.status = 412;
ctx.body = {
code: 412,
msg: '创建宠物信息失败',
data: err
}
}
}else {
ctx.response.status = 416;
ctx.body = {
code: 200,
msg: '参数不齐全'
}
}
}

/**
* 获取宠物详情
* @param ctx
* @returns {Promise.<void>}
*/
static async detail(ctx){
let id = ctx.request.query.id;
if(id){
try{
let data = await petModel.getPet(id);
ctx.response.status = 200;
ctx.body = {
code: 200,
msg: '查询成功',
data
}
}catch(err){
ctx.response.status = 412;
ctx.body = {
code: 412,
msg: '查询失败',
data
}
}
}else {
ctx.response.status = 416;
ctx.body = {
code: 416,
msg: '宠物ID必须传'
}
}
}
}

module.exports = petController;

####路由设置

在routes目录下新建pet.js文件

1
2
3
4
5
6
7
8
9
10
11
const router = require('koa-router')()

const PetController = require('../controllers/pet');

router.prefix('/pet')

router.post('/create',PetController.create);

router.get('/get',PetController.detail)

module.exports = router

然后再App.js中添加以下内容

1
2
const pet = require('./routes/pet')
app.use(pet.routes(), pet.allowedMethods())

最后的项目目录结构如下:

启动项目服务

1
npm run dev

这时候会发现报如下错误:

到这里,看gitHub上的提示是新版本不支持这种引入方式,请参考最新的demo

这里把sequelize的版本降低下来引入

1
npm install sequelize@^5.x.x --save

再 npm run dev,可以看到能正常运行起来了

##测试API

用postman调用刚刚新建的接口

查看数据库

简单的接口实现已完成